3670
19706
تريد تحسين هذا المنشور؟ قدم إجابات مفصلة على هذا السؤال ، بما في ذلك الاستشهادات وشرح سبب صحة إجابتك. يمكن تحرير أو حذف الإجابات التي لا تحتوي على تفاصيل كافية.
ما هي الاختلافات بين git pull و git fetch؟ 
1
2
التالى
في أبسط المصطلحات ، يقوم git pull بعمل git fetch متبوعًا بدمج git.
يمكنك إجراء عملية جلب git في أي وقت لتحديث فروع التتبع عن بُعد الخاصة بك ضمن refs / remote /  /.
لا تغير هذه العملية أبدًا أيًا من الفروع المحلية الخاصة بك تحت المراجع / الرؤساء ، وهي آمنة للقيام بها دون تغيير نسخة العمل الخاصة بك. لقد سمعت حتى عن أشخاص يقومون بتشغيل git fetch بشكل دوري في وظيفة cron في الخلفية (على الرغم من أنني لا أوصي بذلك).
git pull هو ما ستفعله لتحديث فرع محلي بإصداره البعيد ، مع تحديث فروع التتبع عن بُعد الأخرى.
من وثائق Git لـ git pull:
في الوضع الافتراضي ، يعد git pull اختصارًا لـ git fetch متبوعًا بـ git merge FETCH_HEAD.
|
عند استخدام pull ، يحاول Git أن يقوم بعملك تلقائيًا نيابة عنك. إنه حساس للسياق ، لذلك سيقوم Git بدمج أي التزامات مسحوبة في الفرع الذي تعمل فيه حاليًا. يقوم السحب تلقائيًا بدمج الالتزامات دون السماح لك بمراجعتها أولاً. إذا كنت لا تدير فروعك عن كثب ، فقد تواجه صراعات متكررة.
عند الجلب ، يجمع Git أي التزامات من الفرع المستهدف غير موجودة في فرعك الحالي ويخزنها في مستودعك المحلي. ومع ذلك ، فإنه لا يدمجها مع فرعك الحالي. هذا مفيد بشكل خاص إذا كنت بحاجة إلى تحديث المستودع الخاص بك ، ولكنك تعمل على شيء قد ينكسر إذا قمت بتحديث ملفاتك.
لدمج الالتزامات في الفرع الرئيسي الخاص بك ، يمكنك استخدام الدمج.
|
من المهم مقارنة فلسفة التصميم الخاصة بـ git مع فلسفة أداة التحكم بالمصدر الأكثر تقليدية مثل SVN.
تم تصميم التخريب وبنائه باستخدام نموذج العميل / الخادم. يوجد مستودع واحد هو الخادم ، ويمكن للعديد من العملاء جلب الكود من الخادم ، والعمل عليه ، ثم إعادة إرساله إلى الخادم. الافتراض هو أنه يمكن للعميل دائمًا الاتصال بالخادم عندما يحتاج إلى إجراء عملية.
تم تصميم Git لدعم نموذج أكثر توزيعًا دون الحاجة إلى مستودع مركزي (على الرغم من أنه يمكنك بالتأكيد استخدام واحد إذا أردت). تم أيضًا تصميم git بحيث لا يحتاج العميل و "الخادم" إلى الاتصال بالإنترنت في نفس الوقت. تم تصميم Git بحيث يمكن للأشخاص الذين لديهم رابط غير موثوق به تبادل التعليمات البرمجية عبر البريد الإلكتروني ، حتى. من الممكن العمل بشكل منفصل تمامًا ونسخ قرص مضغوط لتبادل التعليمات البرمجية عبر git.
لدعم هذا النموذج ، تحتفظ git بمستودع محلي برمزك وأيضًا مستودع محلي إضافي يعكس حالة المستودع البعيد. من خلال الاحتفاظ بنسخة من المستودع البعيد محليًا ، يمكن لـ git معرفة التغييرات المطلوبة حتى عندما يتعذر الوصول إلى المستودع البعيد. في وقت لاحق عندما تحتاج إلى إرسال التغييرات إلى شخص آخر ، يمكن لـ git نقلها كمجموعة من التغييرات من نقطة زمنية معروفة إلى المستودع البعيد.
git fetch هو الأمر الذي يقول "تحديث النسخة المحلية الخاصة بي من المستودع البعيد".
يقول git pull "أحضر التغييرات في المستودع البعيد إلى المكان الذي احتفظ فيه بشفري الخاص."
عادةً ما يقوم git pull بذلك عن طريق إجراء إحضار git لتحديث النسخة المحلية من المستودع البعيد ، ثم دمج التغييرات في مستودع التعليمات البرمجية الخاص بك وربما نسخة العمل الخاصة بك.
المهم هو أن تضع في اعتبارك أنه غالبًا ما توجد ثلاث نسخ على الأقل من المشروع على محطة العمل الخاصة بك. نسخة واحدة هي مستودعك الخاص مع تاريخ الالتزام الخاص بك. النسخة الثانية هي نسخة العمل الخاصة بك حيث تقوم بالتحرير والبناء. النسخة الثالثة هي النسخة المحلية "المخبأة" من مستودع بعيد.
|
إليكم صورة أوليفر ستيل عن كيفية انسجام كل ذلك معًا:
إذا كان هناك اهتمام كافٍ ، أفترض أنه يمكنني تحديث الصورة لإضافة git clone و git merge ...
|
إحدى حالات استخدام git fetch هي أن ما يلي سيخبرك بأي تغييرات في الفرع البعيد منذ آخر سحب ... حتى تتمكن من التحقق قبل إجراء سحب فعلي ، مما قد يغير الملفات في فرعك الحالي ونسخة العمل.
جلب بوابة
بوابة فرق ... أصل
راجع: https://git-scm.com/docs/git-diff بخصوص بناء الجملة ثنائي النقاط وثلاثي النقاط في الأمر diff
|
لقد كلفني الأمر قليلاً لفهم ما هو الاختلاف ، لكن هذا تفسير بسيط. سيد في مضيفك المحلي هو فرع.
عندما تقوم باستنساخ مستودع ما ، فإنك تجلب المستودع بأكمله إلى مضيفك المحلي. هذا يعني أنه في ذلك الوقت لديك مؤشر أصل / رئيسي إلى HEAD ومؤشر رئيسي يشير إلى نفس الرأس.
عندما تبدأ العمل وتلتزم ، تقدم المؤشر الرئيسي إلى HEAD + التزاماتك. لكن مؤشر الأصل / الرئيسي لا يزال يشير إلى ما كان عليه عندما قمت بالاستنساخ.
لذلك سيكون الاختلاف:
إذا قمت بإحضار git ، فسيؤدي ذلك فقط إلى جلب جميع التغييرات في المستودع البعيد (GitHub) ونقل مؤشر الأصل / الرئيسي إلى HEAD. في غضون ذلك ، سيظل مدير الفرع المحلي يشير إلى المكان الذي يوجد فيه.
إذا أجريت عملية سحب git ، فسيتم جلبها بشكل أساسي (كما هو موضح سابقًا) ودمج أي تغييرات جديدة فيالفرع الرئيسي وحرك المؤشر إلى الرأس.
|
في بعض الأحيان يساعد التمثيل المرئي.
|
موجز
git fetch يشبه السحب ولكنه لا يندمج. أي أنه يجلب التحديثات عن بُعد (المراجع والكائنات) ولكن يظل موقعك المحلي كما هو (أي يتم تحديث الأصل / الرئيسي ولكن يظل المعلم كما هو).
يسحب git pull لأسفل من جهاز تحكم عن بعد ويدمج على الفور.
أكثر
استنساخ git استنساخ الريبو.
يحفظ git rebase الأشياء من فرعك الحالي غير الموجود في فرع المنبع إلى منطقة مؤقتة. الفرع الخاص بك الآن هو نفسه كما كان قبل أن تبدأ تغييراتك. لذا ، فإن git pull -rebase سوف يسحب التغييرات عن بعد ، ويعيد الفرع المحلي الخاص بك ، ويعيد تشغيل التغييرات على الجزء العلوي من الفرع الحالي الخاص بك واحدًا تلو الآخر حتى تكون محدثًا.
أيضًا ، سيعرض لك git Branch -a ما يحدث بالضبط مع جميع الفروع - المحلية والبعيدة.
كانت مشاركة المدونة هذه مفيدة:
الفرق بين git pull و git fetch و git clone (و git rebase) - مايك بيرس
ويغطي git pull و git fetch و git clone و git rebase.
====
تحديث
اعتقدت أنني سأقوم بتحديث هذا لإظهار كيف ستستخدم هذا بالفعل في الممارسة.
قم بتحديث الريبو المحلي الخاص بك من جهاز التحكم عن بعد (لكن لا تدمج):
جلب بوابة
بعد تنزيل التحديثات ، دعنا نرى الاختلافات:
git diff master origin / master
إذا كنت راضيًا عن هذه التحديثات ، فقم بدمج:
بوابة السحب
ملاحظات:
في الخطوة 2: لمعرفة المزيد عن الاختلافات بين المحلية وأجهزة التحكم عن بعد ، راجع: كيفية مقارنة فرع git المحلي بفرعه البعيد؟
في الخطوة 3: ربما يكون الأمر أكثر دقة (على سبيل المثال في الريبو سريع التغير) أن تقوم بأصل git rebase هنا. راجع تعليقJustin Ohms في إجابة أخرى.
أنظر أيضا: http://longair.net/blog/2009/04/16/git-fetch-and-merge/
|
git-pull - الجلب من مستودع آخر أو فرع محلي والدمج معه
ملخص
بوابة السحب ...
وصف
يُشغِّل git-fetch مع المعلمات المحددة ، ويستدعي git-merge لدمج ملف
استرجاع الرأس (الرؤوس) في الفرع الحالي. مع - rebase ، يستدعي git-rebase
بدلاً من git-merge.
لاحظ أنه يمكنك استخدام. (الدليل الحالي) باعتباره  للسحب
من المستودع المحلي - هذا مفيد عند دمج الفروع المحلية
في الفرع الحالي.
لاحظ أيضًا أن الخيارات المخصصة لـ git-pull نفسها و git-merge الأساسية
قبل الخيارات المخصصة لـ git-fetch.
ستسحب إذا كنت تريد دمج التواريخ ، فستجلب إذا كنت تريد فقط "الكودز" حيث قام شخص ما بوضع علامات على بعض المقالات هنا.
|
يمكنك الجلب من مستودع بعيد ، والاطلاع على الاختلافات ثم السحب أو الدمج.
هذا مثال لمستودع بعيد يسمى الأصل وفرع يسمى الرئيسي يتتبع أصل / رئيسي الفرع البعيد:
بوابة الخروج سيد
جلب بوابة
أصل فرق git / سيد
git rebase الأصلي الرئيسي
|
الإجابة المختصرة والسهلة هي أن git pull هي ببساطة git fetch متبوعة بـ git merge.
من المهم جدًا ملاحظة أن git pull ستندمج تلقائيًا سواء أعجبك ذلك أم لا. قد يؤدي هذا ، بالطبع ، إلى اندماج التعارضات. لنفترض أن جهاز التحكم عن بُعد هو الأصل وفرعك هو السيد. إذا كنت git diff origin / master قبل السحب ، فيجب أن يكون لديك فكرة عن تعارضات دمج محتملة ويمكنك إعداد فرعك المحلي وفقًا لذلك.
بالإضافة إلى السحب والدفع ، تتضمن بعض مهام سير العمل git rebase ، مثل هذا ، الذي أعيد صياغته من المقالة المرتبطة:
بوابة سحب الأصل الرئيسي
بوابة الخروج foo-Branch
git rebase master
git push origin foo-Branch
إذا وجدت نفسك في مثل هذا الموقف ، فقد تميل إلى القيام بسحب القاعدة. ما لم تكن تعرف حقًا ما تفعله ، فإنني أنصح بعدم القيام بذلك. هذا التحذير من صفحة الدليل لـ git-pull ، الإصدار 2.3.5:
هذا هو وضع التشغيل الخطير المحتمل. يعيد الكتابة
التاريخ الذي لا يبشر بالخير عندما نشرت ذلك التاريخ
سابقا. لا تستخدم هذا الخيار إلا إذا كنت قد قرأت git-rebase (1)
بحرص.
|
حسنًا ، إليك بعض المعلومات حول git pull و git fetch ، حتى تتمكن من فهم الاختلافات الفعلية ... في بضع كلمات بسيطة ، يحصل الجلب على أحدث البيانات ، لكن لا يتغير الرمز ولن يعبث برمز الفرع المحلي الحالي ، ولكن اسحب احصل على تغييرات الرمز وادمجها في الفرع المحلي الخاص بك ، تابع القراءة للحصول على مزيد من التفاصيل حول كل منها:
جلب بوابة
سيقوم بتنزيل جميع المراجع والعناصر وأي فروع جديدة إلى المستودع المحلي الخاص بك ...
إحضار الفروع و / أو العلامات (مجتمعة ، "المراجع") من واحد أو أكثر
المستودعات الأخرى ، جنبًا إلى جنب مع العناصر الضرورية لإكمال
التواريخ. يتم تحديث فروع التتبع عن بعد (انظر الوصف
أدناه للتعرف على طرق التحكم في هذا السلوك).
بشكل افتراضي ، أي علامة تشير إلى التواريخ التي يتم جلبها هي
جلبت أيضا ؛ التأثير هو جلب العلامات التي تشير إلى الفروع التي
تهتم به. يمكن تغيير هذا السلوك الافتراضي باستخدام
الخيارات --tags أو - no-tags أو عن طريق التكوين
بعيد .. علامة خيار. باستخدام مرجع مرجع يجلب العلامات صراحةً ،
يمكنك جلب العلامات التي لا تشير إلى الفروع التي تهتم بها
في كذلك.
يمكن إحضار git منإما مستودع أو عنوان URL واحد مسمى ، أو
من عدة مستودعات في وقت واحد إذا تم تقديمه وكان هناك ملف
أجهزة التحكم عن بعد. الدخول في ملف التكوين. (انظر git-config1).
عندما لا يتم تحديد جهاز تحكم عن بعد ، فسيكون جهاز التحكم عن بعد الأصلي بشكل افتراضي
المستخدمة ، ما لم يكن هناك فرع المنبع مهيأ للتيار
فرع شجرة.
أسماء المراجع التي تم جلبها مع أسماء الكائنات
يشيرون إليها ، تتم كتابتهم إلى .git / FETCH_HEAD. قد تكون هذه المعلومات
تستخدم بواسطة البرامج النصية أو أوامر git الأخرى ، مثل git-pull.
بوابة السحب
سيتم تطبيق التغييرات من البعيد إلى الفرع الحالي في المحلية ...
يدمج التغييرات من مستودع بعيد إلى الفرع الحالي.
في الوضع الافتراضي ، يعد git pull اختصارًا لـ git fetch متبوعًا
بوابة دمج FETCH_HEAD.
بتعبير أدق ، git pull run git fetch مع المعلمات المحددة و
يستدعي git merge لدمج رؤوس الفروع المسترجعة في التيار
فرع شجرة. باستخدام --rebase ، يتم تشغيل git rebase بدلاً من دمج git.
يجب أن يكون اسم المستودع البعيد كما تم تمريره إلى
git-fetch1. يمكن تسمية المرجع البعيد التعسفي (على سبيل المثال ،
اسم العلامة) أو حتى مجموعة من المراجع ذات الصلة
فروع التتبع عن بعد (على سبيل المثال ، المراجع / الرؤوس /: المراجع / أجهزة التحكم عن بعد / الأصل /) ،
ولكن عادة ما يكون هذا هو اسم فرع في المستودع البعيد.
القيم الافتراضية لـ ويتم قراءتها من
تكوين "عن بعد" و "دمج" للفرع الحالي كما تم تعيينه بواسطة
فرع بوابة - المسار.
أقوم أيضًا بإنشاء الصورة المرئية أدناه لتوضيح كيفية عمل git fetch و git pull معًا ...
|
هذا التمثيل الرسومي التفاعلي مفيد جدًا في فهم البوابة: http://ndpsoftware.com/git-cheatsheet.html
git fetch يقوم فقط "بتنزيل" التغييرات من جهاز التحكم عن بعد إلى المستودع المحلي الخاص بك. git pull يقوم بتنزيل التغييرات ودمجها في فرعك الحالي. "في الوضع الافتراضي ، يعد git pull اختصارًا لـ git fetch متبوعًا بـ git merge FETCH_HEAD."
|
علاوة:
عند الحديث عن pull & fetch في الإجابات أعلاه ، أود مشاركة خدعة ممتعة ،
بوابة السحب - قاعدة
هذا الأمر أعلاه هو الأمر الأكثر فائدة في حياتي git والذي وفر الكثير من الوقت.
قبل دفع التزاماتك الجديدة إلى الخادم ، جرب هذا الأمر وسيقوم تلقائيًا بمزامنة أحدث تغييرات الخادم (مع جلب + دمج) وسيضع الالتزام في الجزء العلوي في سجل git. لا داعي للقلق بشأن السحب / الدمج اليدوي.
اعثر على التفاصيل على: http://gitolite.com/git-pull--rebase
|
أحب أن أحصل على بعض التمثيل المرئي للوضع لفهم هذه الأشياء. ربما يرغب المطورون الآخرون في رؤيتها أيضًا ، لذا ها هي إضافتي. لست متأكدًا تمامًا من صحة كل شيء ، لذا يرجى التعليق إذا وجدت أي أخطاء.
النظام المحلي
. ==================================================== ===
=================. ================= =================================
المستودع البعيد. نسخة عاملة من المستودع المحلي للمستودع البعيد
(الأصل)          . (مخبأ)
فمثلا،      . مرآة
جيثب الريبو. . الريبو عن بعد
يمكن أن يكون كذلك.
متعددة الريبو.
.
.
إحضار * ------------------> *
يتم تحديث ذاكرة التخزين المؤقت المحلية لجهاز التحكم عن بُعد بالأصل (أو عدة ملفات
المصادر الخارجية ، أي الطبيعة الموزعة للبوابة)
.
سحب. شد   *------------------------------------------------ --------> *
يتم دمج التغييرات مباشرة في نسختك المحلية. عندما تحدث النزاعات ،
يطلب منك اتخاذ قرارات.
.
ارتكب            . * <--------------- *
عندما تأتي من التخريب ، على سبيل المثال ، قد تعتقد أن ارتكاب
سيتم تحديث الأصل. في git ، يتم تنفيذ الالتزام فقط في الريبو المحلي الخاص بك.
.
دفع * <--------------------------------------- *
يزامن التغييرات الخاصة بك مرة أخرى في الأصل.
بعض المزايا الرئيسية للحصول على مرآة تم إحضارها من جهاز التحكم عن بُعد هي:
الأداء (قم بالتمرير خلال جميع الالتزامات والرسائل دون محاولة الضغط عليها عبر الشبكة)
تعليقات حول حالة الريبو المحلي الخاص بك (على سبيل المثال ، أستخدم Atlassian's SourceTree ، والذي سيعطيني مصباحًا يشير إلى ما إذا كنت ملتزمًا مسبقًا أو متأخرًا مقارنة بالأصل. يمكن تحديث هذه المعلومات باستخدام GIT FETCH).
|
لقد كافحت مع هذا أيضًا. في الحقيقة لقد جئت إلى هنا من خلال بحث Google عن نفس السؤال بالضبط. قراءة كل هذه الإجابات رسمت أخيرًا صورة في رأسي وقررت أن أحاول أن أحاول أن أضع هذه الصورة في الأسفل بالنظر إلى حالة المستودعات 2 وصندوق رمل واحد والإجراءات التي يتم تنفيذها بمرور الوقت أثناء مشاهدة نسخة منها. إذن هذا ما توصلت إليه. الرجاء تصحيح لي إذا أخطأت في أي مكان.
المستودعات الثلاثة مع الجلب:
--------------------- ----------------------- ------ -----------------
- الريبو عن بعد - - الريبو عن بعد - - الريبو عن بعد -
- - - يتم دفعه - - -
- @ R01 - - @ R02 - - @ R02 -
--------------------- ----------------------- ------ -----------------
--------------------- ----------------------------------------------
- الريبو المحلي - - الريبو المحلي - - الريبو المحلي -
- سحب - - - - جلب -
- @ R01 - - @ R01 - - @ R02 -
--------------------- ----------------------- ------ -----------------
--------------------- ----------------------- ------ -----------------
- وضع الحماية المحلي - - وضع الحماية المحلي - - وضع الحماية المحلي -
- تسجيل الخروج - - تم إنجاز العمل الجديد - - -
- @ R01 - - @ R01 + - - @ R01 + -
--------------------- ----------------------- ------ -----------------
المستودعات الثلاثة مع سحب
--------------------- ----------------------- ------ -----------------
- الريبو عن بعد - - الريبو عن بعد - - الريبو عن بعد -
- - - يتم دفعه - - -
- @ R01 - - @ R02 - - @ R02 -
--------------------- ----------------------- ------ -----------------
--------------------- ----------------------- ------ -----------------
- الريبو المحلي - - الريبو المحلي - - الريبو المحلي -
- سحب - - - - سحب -
- @ R01 - - @ R01 - - @ R02 -
--------------------- ----------------------- ------ -----------------
--------------------- ----------------------- ------ -----------------
- وضع الحماية المحلي - - وضع الحماية المحلي - - وضع الحماية المحلي -
- تسجيل الخروج - - تم عمل جديد - - تم دمجه مع R02 -
- @ R01 - - @ R01 + - - @ R02 + -
--------------------- ----------------------- ------ -----------------
ساعدني هذا في فهم سبب أهمية الجلب.
|
يمكن تفسير الفرق بين GIT Fetch و GIT Pull بالسيناريو التالي:
(مع الأخذ في الاعتبار أن الصور تتحدث بصوت أعلى من الكلمات !، لقد قدمت تمثيلًا تصويريًا)
لنأخذ مثالاً على أنك تعمل في مشروع مع أعضاء فريقك. لذلك سيكون هناك فرع رئيسي واحد للمشروع ويجب على جميع المساهمين تفرعها إلى المستودع المحلي الخاص بهم ثم العمل على هذا الفرع المحلي لتعديل / إضافة وحدات ثم الرجوع إلى الفرع الرئيسي.
وبالتالي،
ستكون الحالة الأولية للفرعين عندما قمت بتقسيم المشروع الرئيسي على المستودع المحلي الخاص بك - (A و B و C وحدات مكتملة بالفعل من المشروع)
الآن ، لقد بدأت العمل على الوحدة الجديدة (لنفترض D) وعندما تنتهي من الوحدة D ، فأنت تريد دفعها إلى الفرع الرئيسي ، ولكن في الوقت نفسه ما يحدث هو أن أحد زملائك في الفريق قد طور الوحدة الجديدة E و F و تعديل C.
ما حدث الآن هو أن المستودع المحلي الخاص بك يفتقر إلى التقدم الأصلي للمشروع ، وبالتالي فإن دفع تغييراتك إلى الفرع الرئيسي يمكن أن يؤدي إلى تعارض وقد يتسبب في تعطل الوحدة D الخاصة بك.
لتجنب مثل هذه المشكلات والعمل بالتوازي مع التقدم الأصلي للمشروع ، هناك طريقتان:
1. Git Fetch- سيؤدي هذا إلى تنزيل جميع التغييرات التي تم إجراؤها على مشروع الفرع الأصلي / الرئيسي غير الموجود في الفرع المحلي. وسوف ننتظر حتى يقوم أمر Git Merge بتطبيق التغييرات التي تم جلبها إلى المستودع أو الفرع الخاص بك.
حتى الآن يمكنك مراقبة الملفات بعناية قبل دمجها في المستودع الخاص بك. ويمكنك أيضًا تعديل D إذا لزم الأمر بسبب تعديل C.
2. Git Pull- سيؤدي هذا إلى تحديث فرعك المحلي بالأصل / الفرع الرئيسي ، أي أن ما يفعله في الواقع هو مزيج من دمج Git Fetch و Git واحدًا تلو الآخر.
ولكن قد يتسبب هذا في حدوث تعارضات ، لذلك يوصى باستخدام Git Pull بنسخة نظيفة.
|
نقول ببساطة:
git pull == git fetch + git merge
إذا قمت بتشغيل git pull ، فلن تحتاج إلى دمج البيانات مع البيانات المحلية. إذا قمت بتشغيل git fetch ، فهذا يعني أنه يجب عليك تشغيل git merge للحصول على أحدث كود على جهازك المحلي. خلاف ذلك ، لن يتم تغيير رمز الجهاز المحلي بدون الدمج.
لذلك في Git Gui ، عندما تقوم بالجلب ، يجب عليك دمج البيانات. لن يؤدي الجلب نفسه إلى إجراء تغييرات على الكود المحلي. يمكنك التحقق من ذلك عند تحديث الرمز عن طريق الجلب
مرة واحدة وجلب وانظر. الكود لن يتغير. ثم تدمج ... سترى الرمز الذي تم تغييره.
|
يسحب git fetch الكود من الخادم البعيد إلى فروع التتبع في المستودع المحلي الخاص بك. إذا تم تسمية جهاز التحكم عن بُعد الخاص بك بالمصدر (الافتراضي) ، فستكون هذه الفروع ضمن الأصل / ، على سبيل المثال ، الأصل / الرئيسي ، الأصل / mybranch-123 ، إلخ. هذه ليست فروعك الحالية ، فهي نسخ محلية لتلك الفروع من الخادم .
يقوم git pull بعملية جلب git ، ولكنه يدمج أيضًا الكود من فرع التتبع في تيارك الحاليالنسخة المحلية من هذا الفرع. إذا لم تكن مستعدًا لهذه التغييرات بعد ، فما عليك سوى جلب الجلب أولاً.
|
سيقوم git fetch باسترداد الفروع البعيدة بحيث يمكنك git diff أو git دمجها مع الفرع الحالي. سيعمل git pull على المنعطف البعيد الذي يتتبعه الفرع الحالي ثم يدمج النتيجة. يمكنك استخدام الأمر git fetch لمعرفة ما إذا كانت هناك أية تحديثات للفرع البعيد دون الحاجة إلى دمجها مع الفرع المحلي.
|
Git Fetch
يمكنك تنزيل التغييرات إلى فرعك المحلي من الأصل حتى الجلب. يطلب Fetch من الريبو البعيد لجميع الالتزامات التي قام بها الآخرون ولكن ليس لديك في الريبو المحلي الخاص بك. قم بإحضار هذه الالتزامات وإضافتها إلى المستودع المحلي.
جيت دمج
يمكنك تطبيق التغييرات التي تم تنزيلها من خلال الجلب باستخدام أمر الدمج. ستأخذ عملية الدمج الالتزامات المستردة من الجلب وتحاول إضافتها إلى فرعك المحلي. سيحتفظ الدمج بسجل الالتزام بالتغييرات المحلية الخاصة بك بحيث عندما تشارك فرعك مع push ، سيعرف Git كيف يمكن للآخرين دمج تغييراتك.
جيت بول
تعمل ميزة الجلب والدمج معًا في كثير من الأحيان بما يكفي لإنشاء أمر يجمع بين الاثنين ، السحب. يقوم Pull بعملية جلب ثم دمج لإضافة الالتزامات التي تم تنزيلها إلى فرعك المحلي.
|
بعبارات بسيطة ، إذا كنت على وشك القفز على متن طائرة بدون أي اتصال بالإنترنت ... قبل المغادرة ، يمكنك فقط القيام بجلب الأصل . سيؤدي ذلك إلى جلب جميع التغييرات إلى جهاز الكمبيوتر الخاص بك ، ولكن اجعله منفصلاً عن مساحة العمل / التطوير المحلي لديك.
على المستوى ، يمكنك إجراء تغييرات على مساحة العمل المحلية الخاصة بك ثم دمجها مع ما قمت بجلبه وحل تعارضات الدمج المحتملة ، كل ذلك بدون اتصال بالإنترنت. وما لم يقم شخص ما بإجراء تغييرات جديدة على المستودع البعيد ، فبمجرد وصولك إلى الوجهة ، ستفعل الأمر git push origin  وتذهب للحصول على قهوتك.
من هذا البرنامج التعليمي الرائع في Atlassian:
يقوم الأمر git fetch بتنزيل الالتزامات والملفات والمراجع من ملف
المستودع البعيد في المستودع المحلي الخاص بك.
الجلب هو ما تفعله عندما تريد أن ترى ما يمتلكه الآخرون
كان يعمل عليه. إنه مشابه لتحديث SVN من حيث أنه يتيح لك الرؤية
كيف تقدم التاريخ المركزي ، لكنه لا يجبرك على ذلك
في الواقع دمج التغييرات في المستودع الخاص بك. عزلات Git
المحتوى الذي تم جلبه باعتباره من المحتوى المحلي الموجود ، فهو يحتوي على
لا يوجد تأثير على أعمال التنمية المحلية الخاصة بك. يجب سحب المحتوى الذي تم جلبه بشكل صريح باستخدام الأمر git checkout. هذا يجعل
جلب طريقة آمنة لمراجعة الالتزامات قبل دمجها مع
المستودع المحلي الخاص بك.
عند تنزيل محتوى من مستودع بعيد ، تتوفر أوامر git pull و git fetch لإنجاز المهمة. يمكنك النظر
جلب git الإصدار "الآمن" من الأمرين. سيتم تنزيله
المحتوى البعيد ، ولكن لا يتم تحديث حالة عمل المستودع المحلي الخاص بك ،
ترك عملك الحالي كما هو. git pull هو الأكثر عدوانية
كبديل ، سيتم تنزيل المحتوى البعيد للموقع المحلي النشط
الفرع وتنفيذ git merge فورًا لإنشاء التزام دمج
للمحتوى البعيد الجديد. إذا كان لديك تغييرات معلقة قيد التقدم
سيؤدي هذا إلى حدوث تعارضات وبدء حل تعارض الدمج
تدفق.
مع git pull:
لا تحصل على أي عزلة.
لا تحتاج إلى سحبها بشكل صريح. لأنه يقوم ضمنيًا بدمج git.
ستؤثر خطوة الدمج على التنمية المحلية وقد تتسبب في حدوث تعارضات
إنها في الأساس ليست آمنة. إنها عدوانية.
على عكس git fetch حيث يؤثر فقط على .git / refs / remote ، سيؤثر الأمر git pull على كل من .git / refs / remote and .git / refs / heads /
حسنًا ... إذا لم أكن أقوم بتحديث نسخة العمل باستخدام git fetch ، فأين أقوم بإجراء التغييرات؟ أين متجر Git جلب الالتزامات الجديدة؟
سؤال رائع. يضعها في مكان ما معزول عن نسخة العمل الخاصة بك. لكن مرة أخرى أين؟ هيا نكتشف.
في دليل مشروعك (على سبيل المثال ، حيث تقوم بأوامر git) قم بما يلي:
ls. سيظهر هذا الملفات والدلائل. لا شيء رائع ، أعرف.
افعل الآن ls -a. سيعرض هذا ملفات نقطية ، أي الملفات التي تبدأ بـ. ستتمكن بعد ذلك من رؤية دليل باسم: .git.
قم بعمل cd .git. من الواضح أن هذا سيغير دليلك.
الآن يأتي الجزء الممتع. تفعل ls. سترى قائمة الدلائل. نحن نبحث عن المراجع. قم بعمل مراجع cd.
من المثير للاهتمام رؤية ما بداخل كل الدلائل ، لكن دعنا نركز على اثنين منها. الرؤوس وأجهزة التحكم عن بعد. استخدم القرص المضغوط للتحقق من داخلها أيضًا.
سيؤدي أي جلب git تقوم به إلى تحديث العناصر في الدليل /.git/refs/remotes. لن يتم تحديث أي شيء في دليل /.git/refs/heads.
سيؤدي أي سحب git أولاً إلى جلب git ، وتحديث العناصر في دليل /.git/refs/remotes ، ثم دمجها مع الدليل المحلي الخاص بك ثم تغيير الرأس داخل دليل /.git/refs/heads.
يمكن أيضًا العثور على إجابة جيدة جدًا ذات صلة في أين مكان "git fetch" ؟.
أيضًا ، ابحث عن "التدوين المائل" من مشاركة اصطلاحات تسمية فرع Git. يساعدك على فهم كيفية وضع Git للأشياء بشكل أفضلأدلة مختلفة.
لمعرفة الفرق الفعلي
فقط افعل:
بوابة جلب الأصل الرئيسية
بوابة الخروج سيد
إذا تم تحديث المعلم البعيد ، فستتلقى رسالة مثل هذه:
يقع فرعك خلف "الأصل / الرئيسي" بمقدار عملين ، ويمكن إعادة توجيهه بسرعة.
(استخدم "git pull" لتحديث الفرع المحلي الخاص بك)
إذا لم تجلب وفعلت أمر git checkout ، فلن يعرف git المحلي أن هناك التزامين مضافين. وستقول فقط:
بالفعل في "ماجستير"
الفرع الخاص بك محدث مع "الأصل / الرئيسي".
لكن هذا عفا عليه الزمن وغير صحيح. ذلك لأن git ستعطيك ملاحظات بناءً على ما تعرفه فقط. إنه غافل عن الالتزامات الجديدة التي لم يسحبها بعد ...
هل هناك طريقة لمشاهدة التغييرات الجديدة التي تم إجراؤها في جهاز التحكم عن بعد أثناء العمل في الفرع محليًا؟
بعض IDEs (مثل Xcode) ذكية للغاية وتستخدم نتيجة git fetch ويمكنها إضافة تعليقات توضيحية إلى سطور الكود التي تم تغييرها في الفرع البعيد لفرع العمل الحالي. إذا تم تغيير هذا الخط من خلال التغييرات المحلية والفرع البعيد ، فسيتم تعليق هذا الخط باللون الأحمر. هذا ليس تعارض دمج. إنه تعارض دمج محتمل. إنها عبارة عن تنبيه يمكنك استخدامه لحل تعارض الدمج المستقبلي قبل القيام بسحب git من الفرع البعيد.
نصيحة ممتعة:
إذا قمت بإحضار فرع بعيد ، على سبيل المثال فعل:
ميزة git fetch origin / 123
ثم ينتقل هذا إلى دليل أجهزة التحكم عن بُعد. لا يزال غير متاح للدليل المحلي الخاص بك. ومع ذلك ، فإنه يبسط عملية الدفع الخاصة بك إلى ذلك الفرع البعيد بواسطة DWIM (افعل ما أعنيه):
ميزة بوابة الخروج / 123
لم تعد بحاجة إلى القيام بما يلي:
بوابة الخروج -b feature / 123 origin / feature / 123
لمزيد من المعلومات عن ذلك اقرأ هنا
|
الفرق الوحيد بين git pull و git fetch هو أن:
تسحب git pull من فرع بعيد وتدمجها.
جلب git عمليات الجلب فقط من الفرع البعيد ولكنها لا تندمج
أي git pull = git fetch + git merge ...
|
يسمح Git بتطبيق الالتزامات الأقدم ترتيبًا زمنيًا بعد الالتزامات الأحدث.
لهذا السبب ، يتم تقسيم عملية نقل الالتزامات بين المستودعات إلى خطوتين:
نسخ الالتزامات الجديدة من الفرع البعيد لنسخ هذا الفرع البعيد داخل الريبو المحلي.
(الريبو لعملية الريبو) master @ remote >> remote / origin / master @ local
دمج ارتباطات جديدة في الفرع المحلي
(عملية داخل الريبو) remote / origin / master @ local >> master @ local
هناك طريقتان للقيام بالخطوة 2. يمكنك:
فرع محلي بعد آخر سلف مشترك وإضافة تعهدات جديدة موازية للالتزامات التي تنفرد بها المستودع المحلي ، ويتم الانتهاء منها عن طريق دمج الالتزام وإغلاق مفترق الطرق.
أدخل الالتزامات الجديدة بعد السلف المشترك الأخير وأعد تقديم الالتزامات الفريدة للمستودع المحلي.
في مصطلحات git ، الخطوة 1 هي git fetch ، والخطوة 2 هي git merge أو git rebase
git pull هو git fetch و git merge
|
يحصل Git على فرع أحدث إصدار من جهاز التحكم عن بُعد إلى المحلي باستخدام أمرين:
git fetch: سيحصل Git على أحدث إصدار من جهاز بعيد إلى محلي ، لكنه لا يتم دمجه تلقائيًا.

بوابة جلب الأصل الرئيسية
بوابة الدخول - p master..origin / master
أصل / سيد git
تعني الأوامر أعلاه تنزيل أحدث إصدار من الفرع الرئيسي من الأصل من جهاز التحكم عن بُعد إلى الفرع الرئيسي الأصلي. ثم يقارن الفرع الرئيسي المحلي والفرع الرئيسي الأصلي. أخيرًا ، ادمج.
git pull: سيحصل Git على أحدث إصدار من جهاز التحكم عن بُعد ويدمج في المحلي.

بوابة سحب الأصل الرئيسي
الأمر أعلاه يكافئ git fetch و git merge. من الناحية العملية ، قد يكون git fetch أكثر أمانًا لأنه قبل الدمج يمكننا رؤية التغييرات وتحديد ما إذا كان سيتم الدمج أم لا.
|
ما هو الفرق بين git pull و git fetch؟
لفهم هذا ، عليك أولاً أن تفهم أن git المحلي لا يحافظ فقط على المستودع المحلي الخاص بك ، ولكنه يحتفظ أيضًا بنسخة محلية من المستودع البعيد.
يعمل git fetch على تحديث نسختك المحلية من المستودع البعيد. على سبيل المثال ، إذا كان المستودع البعيد الخاص بك هو GitHub - فقد ترغب في جلب أي تغييرات تم إجراؤها في المستودع البعيد إلى نسختك المحلية منه إلى المستودع البعيد. سيسمح لك هذا بإجراء عمليات مثل المقارنة أو الدمج.
git pull من ناحية أخرى سوف يسقط التغييرات في المستودع البعيد حيث تحتفظ بالكود الخاص بك. عادةً ما يقوم git pull بإجراء عملية جلب git أولاً لتحديث النسخة المحلية من المستودع البعيد ، ثم يقوم بدمج التغييرات في مستودع التعليمات البرمجية الخاص بك وربما نسخة العمل الخاصة بك.
|
git pull == (git fetch + git merge)
لا يتغير git fetch إلى الفروع المحلية.
إذا كان لديك بالفعل مستودع محلي مع إعداد عن بعد للمشروع المطلوب ، فيمكنك الحصول على جميع الفروع والعلامات لجهاز التحكم عن بُعد الحالي باستخدام git fetch. ... لا يُجري Fetch أي تغييرات على الفروع المحلية ، لذلك ستحتاج إلى دمج فرع بعيد مع فرع محلي مزدوج لدمج تغييرات الجلب الجديدة. من جيثب
|
تمثيل رسومي بسيط للمبتدئين ،
هنا،
بوابة السحب
سوف يجلب الكودمن المستودع وإعادة الأساسي مع موقعك المحلي ... في git pull هناك إمكانية إنشاء التزامات جديدة.
ولكن في ،
جلب بوابة
سيجلب الرمز من المستودع ونحتاج إلى إعادة وضعه يدويًا باستخدام git rebase
على سبيل المثال: سأقوم بالجلب من الخادم الرئيسي وإعادة وضعه في رئيسي المحلي.
1) git pull (ستتم إعادة الأساسي تلقائيًا):
بوابة سحب الأصل الرئيسي
هنا الأصل هو سيد الريبو البعيد الخاص بك هو فرعك
2) git fetch (تحتاج إلى إعادة التعيين يدويًا):
بوابة جلب الأصل الرئيسية
سوف يجلب تغييرات الخادم من الأصل. وسيظل في منطقتك حتى تعيد تأسيسه بنفسك. نحتاج إلى إصلاح التعارضات يدويًا عن طريق التحقق من الرموز.
git rebase origin / master
سيؤدي هذا إلى إعادة إنشاء الرمز إلى محلي. قبل ذلك تأكد من أنك في الفرع الصحيح.
|
تحاول أن تكون واضحًا وبسيطًا.
أمر git pull هو في الواقع اختصار لـ git fetch متبوعًا بأمر git merge أو الأمر git rebase اعتمادًا على التكوين الخاص بك. يمكنك تكوين مستودع Git الخاص بك بحيث يكون git pull عبارة عن عملية إحضار متبوعة بإعادة تأسيس.
|
في الواقع يحتفظ Git بنسخة من التعليمات البرمجية الخاصة بك وملفات
المستودع البعيد.
يعمل الأمر git fetch على تحديث نسختك المحلية عن طريق الحصول على البيانات من مستودع بعيد. سبب حاجتنا إلى هذا هو أن شخصًا آخر ربما أجرى بعض التغييرات على الكود وتريد أن تبقي نفسك على اطلاع.
يجلب الأمر git pull التغييرات في المستودع البعيد إلى المكان الذي تحتفظ فيه بالكود الخاص بك. عادةً ما يقوم git pull بذلك عن طريق إجراء "git fetch" أولاً لتحديث النسخة المحلية من المستودع البعيد ، ثم يقوم بدمج التغييرات في مستودع التعليمات البرمجية الخاص بك وربما نسخة العمل الخاصة بك.
|
1
2
التالى
سؤال نشط للغاية. اكسب 10 سمعة للإجابة على هذا السؤال. تساعد متطلبات السمعة في حماية هذا السؤال من البريد العشوائي ونشاط عدم الإجابة.
ليس الجواب الذي تبحث عنه؟ تصفح الأسئلة الأخرى الموسومة git version-control git-pull git-fetch أو اطرح سؤالك الخاص.